﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Data;

namespace prjCompras
{
    public partial class frmProcRespostaCotacao : FormProcessoPadrao.FormProcessoPadrao
    {
        public frmProcRespostaCotacao()
        {
            InitializeComponent();
        }

        List<string> cond = new List<string>();

        private void frmProcRespostaCotacao_Load(object sender, EventArgs e)
        {
            dtgrdvwCartaCotacao.DataSource = null;
            campos = new List<string>();
            string sql = "Select CC.Codigo, F.Nome, CC.Data ";
            sql += "from CartaCotacao CC, Fornecedor F ";
            sql += "where CC.CNPJFornecedor = F.CNPJ ";
            sql += "and cc.Codigo not in (select rc.CodigoCotacao from RespostaCotacao rc)";
            dtgrdvwCartaCotacao.DataSource = Conexao.getInstance.executeQuery(sql);
            dtgrdvwCartaCotacao.Columns[1].HeaderText = "Nome Fornecedor";
            atualizaCondPgto();
            insereTextoProcesso(" Resposta da Carta de Cotação");
            dtmpckrDataEntrega.MinDate = System.DateTime.Now;
            mskdtxtbxValorFrete.Text = "0,00".PadLeft(8, ' ') ;
        }

        private void dtgrdvwCartaCotacao_SelectionChanged(object sender, EventArgs e)
        {
            if (dtgrdvwCartaCotacao.RowCount > 0)
            {
                dtgrdvwMateriais.Columns.Clear();
                dtgrdvwMateriais.DataSource = null;
                string sql = @"Select CCM.CodigoMaterial, M.Nome, CCM.Quantidade, '0,00' ValorUnitario,
                    '0' qtde_atendida, '0,00' valor_total 
                    from CartaCotacaoMaterial CCM, Material M ";
                sql += "where CCM.CodigoCartaCotacao = " + dtgrdvwCartaCotacao.CurrentRow.Cells[0].Value.ToString();
                sql += " and CCM.CodigoMaterial = M.Codigo";
                dtgrdvwMateriais.DataSource = Conexao.getInstance.executeQuery(sql);

                dtgrdvwMateriais.Columns[0].HeaderText = "Código";
                dtgrdvwMateriais.Columns[3].HeaderText = "Valor Unitário";
                dtgrdvwMateriais.Columns[4].HeaderText = "Quantidade Atendida";
                dtgrdvwMateriais.Columns[5].HeaderText = "Valor Total";
                materiais();

                for (int i = 0; i < dtgrdvwMateriais.Columns.Count; i++)
                {
                    dtgrdvwMateriais.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                }
            }
        }


        private void dtgrdvwMateriais_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            materiais();
        }

        private void materiais()
        {
            if (dtgrdvwMateriais.RowCount > 0)
            {
                txtbxCodigoMaterial.Text = dtgrdvwMateriais.CurrentRow.Cells[0].Value.ToString();
                txtbxNomeMaterial.Text = dtgrdvwMateriais.CurrentRow.Cells[1].Value.ToString();
                nmrcpdwnQtdePedida.Value = Convert.ToInt32(dtgrdvwMateriais.CurrentRow.Cells[2].Value.ToString());
                if (dtgrdvwMateriais.Columns.Count > 3)
                {
                    mskdtxtbxValorUnitário.Text = dtgrdvwMateriais.CurrentRow.Cells[3].Value.ToString().PadLeft(8, ' ');
                    nmrcpdwnQtdeAtendida.Maximum = 1000;
                    nmrcpdwnQtdeAtendida.Value = Convert.ToInt32(dtgrdvwMateriais.CurrentRow.Cells[4].Value.ToString());
                    nmrcpdwnQtdeAtendida.Maximum = nmrcpdwnQtdePedida.Value;
                    double valorTotal = 0.00;
                    valorTotal = Convert.ToDouble(mskdtxtbxValorUnitário.Text) * Convert.ToDouble(nmrcpdwnQtdeAtendida.Value);

                    mskdtxtbxValorTotal.Text = String.Format("{0:N2}", valorTotal).PadLeft(10, ' ');
                }
            }
        }

        private void mskdtxtbxValorUnitário_TextChanged(object sender, EventArgs e)
        {
            if (dtgrdvwMateriais.Columns.Count > 3 && dtgrdvwMateriais.RowCount > 0)
            {
                try
                {
                    dtgrdvwMateriais.CurrentRow.Cells[3].Value = mskdtxtbxValorUnitário.Text.TrimStart();
                    double valorTotal = Convert.ToDouble(mskdtxtbxValorUnitário.Text) * Convert.ToDouble(nmrcpdwnQtdeAtendida.Value);
                    string valor = String.Format("{0:N2}", valorTotal);
                    mskdtxtbxValorTotal.Text = valor.PadLeft(10, ' ');
                }
                catch
                {

                }
            }
        }

        private void nmrcpdwnQtdeAtendida_ValueChanged(object sender, EventArgs e)
        {
            if (dtgrdvwMateriais.Columns.Count > 3 && dtgrdvwMateriais.RowCount > 0)
            {
                dtgrdvwMateriais.CurrentRow.Cells[4].Value = nmrcpdwnQtdeAtendida.Value.ToString();
                double valorTotal = Convert.ToDouble(mskdtxtbxValorUnitário.Text) * Convert.ToDouble(nmrcpdwnQtdeAtendida.Value);
                string valor = String.Format("{0:N2}", valorTotal);
                mskdtxtbxValorTotal.Text = valor.PadLeft(10, ' ');
            }
        }

        private void mskdtxtbxValorTotal_TextChanged(object sender, EventArgs e)
        {
            if (dtgrdvwMateriais.Columns.Count > 3 && dtgrdvwMateriais.RowCount > 0)
            {
                dtgrdvwMateriais.CurrentRow.Cells[5].Value = mskdtxtbxValorTotal.Text.TrimStart();
            }
        }

        private void dtgrdvwMateriais_KeyDown(object sender, KeyEventArgs e)
        {
            int linha = dtgrdvwMateriais.CurrentRow.Index;
            int coluna = dtgrdvwMateriais.CurrentCell.ColumnIndex;
            if (e.KeyCode == Keys.Down)
            {
                if (linha + 1 < dtgrdvwMateriais.RowCount)
                {
                    dtgrdvwMateriais.CurrentCell = dtgrdvwMateriais.Rows[linha + 1].Cells[coluna];
                    dtgrdvwMateriais_CellClick(sender, null);
                    e.SuppressKeyPress = true;
                }
            }
            else if (e.KeyCode == Keys.Up)
            {
                if (linha - 1 >= 0)
                {
                    dtgrdvwMateriais.CurrentCell = dtgrdvwMateriais.Rows[linha - 1].Cells[coluna];
                    dtgrdvwMateriais_CellClick(sender, null);
                    e.SuppressKeyPress = true;
                }
            }
            else if (e.KeyCode == Keys.PageUp || e.KeyCode == Keys.PageDown || e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab)
            {
                e.SuppressKeyPress = true;
            }
        }

        private void mskdtxtbxValorUnitário_Leave(object sender, EventArgs e)
        {
            try
            {
                Convert.ToDouble(mskdtxtbxValorUnitário.Text);
            }
            catch
            {
                mskdtxtbxValorUnitário.Focus();
            }
        }

        private void txtbxCodigoCondicaoPagamento_Leave(object sender, EventArgs e)
        {
            try
            {
                string sql = "select c.Nome from CondicaoPagamento c where c.Codigo = '" + txtbxCodigoCondicaoPagamento.Text + "'";
                DataTable dt = Conexao.getInstance.executeQuery(sql);
                DataRow dr = dt.Rows[0];
                txtbxCondicaoPagamentoNome.Text = dr[0].ToString(); ;
            }
            catch
            {
                txtbxCondicaoPagamentoNome.Text = "";
            }

        }

        private void btnPesquisarCondicaoPagamento_Click(object sender, EventArgs e)
        {
            frmPesquisaPadrao f = new frmPesquisaPadrao();
            f.setTituloForm("Pesquisar Condição de Pagamento");
            f.setTabela("CondicaoPagamento");
            f.addCampo("Codigo");
            f.addTitulo("Código");
            f.addCampo("Nome");
            f.addTitulo("Nome");
            f.carregaGrid();
            f.carregaCombo();
            f.ShowDialog();
            if (!f.cancelar)
            {
                txtbxCodigoCondicaoPagamento.Text = f.pk;
                txtbxCodigoCondicaoPagamento_Leave(sender, e);
            }
        }

        private void btnAdicionar_Click(object sender, EventArgs e)
        {
            if (txtbxCodigoCondicaoPagamento.Text == "")
            {
                MessageBox.Show("Informe uma Condição de Pagamento!", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtbxCodigoCondicaoPagamento.Focus();
                return;
            }

            txtbxCodigoCondicaoPagamento_Leave(sender, e);
            if (txtbxCondicaoPagamentoNome.Text == "")
            {
                MessageBox.Show("Condição de Pagamento não existe!", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtbxCodigoCondicaoPagamento.Focus();
                return;
            }

            if (!cond.Contains(txtbxCodigoCondicaoPagamento.Text))
            {
                cond.Add(txtbxCodigoCondicaoPagamento.Text);
            }

            atualizaCondPgto();

        }

        private void dtgrdvwCondicaoPagamento_CellClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void atualizaCondPgto()
        {
            string conds = "";

            foreach (string c in cond)
            {
                if (conds != "")
                {
                    conds += ", ";
                }

                conds += c;
            }

            string sql = "Select Codigo, Nome from CondicaoPagamento where Codigo in (" + conds + ")";
            if (cond.Count == 0)
            {
                sql = "Select Codigo, Nome from CondicaoPagamento where Codigo = -1";
            }
            dtgrdvwCondicaoPagamento.DataSource = Conexao.getInstance.executeQuery(sql);

            txtbxCodigoCondicaoPagamento.Text = "";
            txtbxCodigoCondicaoPagamento_Leave(null, null);

        }

        private void dtgrdvwCondicaoPagamento_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dtgrdvwCondicaoPagamento.RowCount > 0)
            {
                cond.Remove(dtgrdvwCondicaoPagamento.CurrentRow.Cells[0].Value.ToString());
            }
            atualizaCondPgto();
        }

        public override bool metodo()
        {
            try
            {
                if (dtgrdvwCartaCotacao.RowCount == 0)
                {
                    MessageBox.Show("Não há cartas de cotação para cadastrar a resposta!", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }

                if (dtgrdvwMateriais.RowCount == 0)
                {
                    MessageBox.Show("Não há materiais na carta de cotação para cadastrar resposta!", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }

                if (dtgrdvwCondicaoPagamento.RowCount == 0)
                {
                    MessageBox.Show("Não há condições de pagamento para esta resposta!", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }

                List<string> campos = new List<string>();
                campos.Add("CodigoCotacao");
                campos.Add("CNPJFornecedor");
                campos.Add("DataEntrega");
                campos.Add("ValorFrete");
                campos.Add("Observacao");
                campos.Add("PedidoGerado");

                string cnpjForn = "";
                DataTable dt = Conexao.getInstance.executeQuery("Select CNPJFornecedor from CartaCotacao where Codigo = " +
                    dtgrdvwCartaCotacao.CurrentRow.Cells[0].Value.ToString());
                DataRow dr = dt.Rows[0];
                cnpjForn = dr[0].ToString();

                List<object> valores = new List<object>();
                valores.Add(dtgrdvwCartaCotacao.CurrentRow.Cells[0].Value.ToString());
                valores.Add(cnpjForn);
                valores.Add(dtmpckrDataEntrega.Value.ToString());

                mskdtxtbxValorFrete.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
                if (mskdtxtbxValorFrete.Text == "")
                {
                    valores.Add(0);
                }
                else
                {
                    mskdtxtbxValorFrete.TextMaskFormat = MaskFormat.IncludeLiterals;
                    valores.Add(mskdtxtbxValorFrete.Text.TrimStart().Replace(",", "."));
                }
                valores.Add(txtbxObservacao.Text);
                valores.Add(0);

                string sql = SqlCrud.getInstance.insert(ConstTabelas.RESPOSTACOTACAO, campos, valores);

                if (!Conexao.getInstance.execute(sql, false))
                {
                    return false;
                }

                string cod_carta = "";

                dt = Conexao.getInstance.executeQuery(SqlCrud.getInstance.selectMax(ConstTabelas.RESPOSTACOTACAO));
                dr = dt.Rows[0];
                cod_carta = dr[0].ToString();

                campos.Clear();
                campos.Add("CodigoRespostaCotacao");
                campos.Add("CodigoMaterial");
                campos.Add("ValorUnitario");
                campos.Add("QtdAtendida");
                campos.Add("Situacao");

                foreach (DataGridViewRow r in dtgrdvwMateriais.Rows)
                {
                    valores.Clear();
                    valores.Add(cod_carta);
                    valores.Add(r.Cells[0].Value.ToString());
                    valores.Add(r.Cells[3].Value.ToString().Replace(",", "."));
                    valores.Add(r.Cells[4].Value.ToString());
                    valores.Add(0);

                    sql = SqlCrud.getInstance.insert(ConstTabelas.RESPOSTACOTACAOMATERIAL, campos, valores);

                    if (!Conexao.getInstance.execute(sql, false))
                    {
                        return false;
                    }
                }

                campos.Clear();
                campos.Add("CodigoRespostaCotacao");
                campos.Add("CodigoCondicaoPagamento");

                foreach (DataGridViewRow r in dtgrdvwCondicaoPagamento.Rows)
                {
                    valores.Clear();
                    valores.Add(cod_carta);
                    valores.Add(r.Cells[0].Value.ToString());
                    sql = SqlCrud.getInstance.insert(ConstTabelas.RESPOSTACOTACAOCONDICAOPAGAMENTO, campos, valores);
                    if (!Conexao.getInstance.execute(sql, false))
                    {
                        return false;
                    }
                }

                Conexao.getInstance.CommitTransacao();
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }            
        }

        //9,2
    }
}
